#include "camera.h"

Camera::Camera(Ponto n, Ponto v, Ponto c, float d, float hX, float hY)
{

    this->v = Operacoes::ortogonalizaVetor(v,n);

    this->n = Operacoes::normalizaVetor(n);
    this->v = Operacoes::normalizaVetor(this->v);
    this->u = Operacoes::produtoVetorial(this->n, this->v);
    this->u = Operacoes::normalizaVetor(this->u);

    this->c = c;
    this->d = d;
    this->hX = hX;
    this->hY = hY;
    this->k = 1;
}

Camera::~Camera()
{
}

Ponto Camera::getN(){
    return this->n;
}

Ponto Camera::getV(){
    return this->v;
}

Ponto Camera::getU(){
    return this->u;
}

Ponto Camera::getC(){
    return this->c;
}

float Camera::getD(){
    return this->d;
}

float Camera::getHX(){
    return this->hX;
}

float Camera::getHY(){
    return this->hY;
}

int Camera::getK(){
    return this->k;
}

void Camera::setN(Ponto n){
    this->n.setPonto(n.getX(), n.getY(), n.getZ());
}

void Camera::setV(Ponto v){
    this->v.setPonto(v.getX(), v.getY(), v.getZ());
}

void Camera::setU(Ponto u){
    this->u.setPonto(u.getX(), u.getY(), u.getZ());
}

void Camera::setC(Ponto c){
    this->c.setPonto(c.getX(), c.getY(), c.getZ());
}

void Camera::setD(float d){
    this->d = d;
}

void Camera::setHX(float hX){
    this->hX = hX;
}

void Camera::setHY(float hY){
    this->hY = hY;
}

void Camera::setK(int k){
    this->k = k;
}

void Camera::translacaoN(bool sentido){//true = positivo, false = negativo
    if(sentido)
        this->c = Operacoes::somaPonto(c, Operacoes::multEscalar(this->n, this->k));
    else
        this->c = Operacoes::subtraiPonto(c, Operacoes::multEscalar(this->n, this->k));
}

void Camera::translacaoV(bool sentido){//true = positivo, false = negativo
    if(sentido)
        this->c = Operacoes::somaPonto(c, Operacoes::multEscalar(this->v, this->k));
    else
        this->c = Operacoes::subtraiPonto(c, Operacoes::multEscalar(this->v, this->k));
}

void Camera::translacaoU(bool sentido){//true = positivo, false = negativo
     if(sentido)
        this->c = Operacoes::somaPonto(c, Operacoes::multEscalar(this->u, this->k));
    else
        this->c = Operacoes::subtraiPonto(c, Operacoes::multEscalar(this->u, this->k));
}

void Camera::rotacaoN(float angulo){ //usada pra rotacionar de v para u, n se mantem constante.
    //*
    this->u = Operacoes::somaPonto(Operacoes::multEscalar(this->u, (float)cos(angulo)), Operacoes::multEscalar(this->v, (float)sin(angulo)));
    this->v = Operacoes::somaPonto(Operacoes::multEscalar(this->u, (float)-sin(angulo)), Operacoes::multEscalar(this->v, (float)cos(angulo)));//*/
    /*
    float xTemp, yTemp;
    xTemp = (float)cos(angulo)*this->u.getX() + (float)-sin(angulo)*this->u.getY();
    yTemp = (float)sin(angulo)*this->u.getX() + (float)cos(angulo)*this->u.getY();
    this->u.setX(xTemp);
    this->u.setY(yTemp);
    xTemp = (float)cos(angulo)*this->v.getX() + (float)-sin(angulo)*this->v.getY();
    yTemp = (float)sin(angulo)*this->v.getX() + (float)cos(angulo)*this->v.getY();
    this->v.setX(xTemp);
    this->v.setY(yTemp);//*/
}

void Camera::rotacaoV(float angulo){ //usada pra rotacionar de n para u, v se mantem constante.
    //*
    this->u = Operacoes::somaPonto(Operacoes::multEscalar(this->u, (float)cos(angulo)), Operacoes::multEscalar(this->n, (float)-sin(angulo)));
    this->n = Operacoes::somaPonto(Operacoes::multEscalar(this->u, (float)sin(angulo)), Operacoes::multEscalar(this->n, (float)cos(angulo)));//*/
    /*
    float xTemp, yTemp;
    xTemp = (float)cos(angulo)*this->u.getZ() + (float)-sin(angulo)*this->u.getX();
    yTemp = (float)sin(angulo)*this->u.getZ() + (float)cos(angulo)*this->u.getX();
    this->u.setX(xTemp);
    this->u.setY(yTemp);
    xTemp = (float)cos(angulo)*this->n.getZ() + (float)-sin(angulo)*this->n.getX();
    yTemp = (float)sin(angulo)*this->n.getZ() + (float)cos(angulo)*this->n.getX();
    this->n.setX(xTemp);
    this->n.setY(yTemp);//*/
}

void Camera::rotacaoU(float angulo){ //usada pra rotacionar de n para v, u se mantem constante.
    //*
    this->v = Operacoes::somaPonto(Operacoes::multEscalar(this->v, (float)cos(angulo)), Operacoes::multEscalar(this->n, (float)sin(angulo)));
    this->n = Operacoes::somaPonto(Operacoes::multEscalar(this->v, (float)-sin(angulo)), Operacoes::multEscalar(this->n, (float)cos(angulo)));//*/
    /*
    float xTemp, yTemp;
    xTemp = (float)cos(angulo)*this->v.getZ() + (float)-sin(angulo)*this->v.getY();
    yTemp = (float)sin(angulo)*this->v.getZ() + (float)cos(angulo)*this->v.getY();
    this->v.setX(xTemp);
    this->v.setY(yTemp);
    xTemp = (float)cos(angulo)*this->n.getZ() + (float)-sin(angulo)*this->n.getY();
    yTemp = (float)sin(angulo)*this->n.getZ() + (float)cos(angulo)*this->n.getY();
    this->n.setX(xTemp);
    this->n.setY(yTemp);//*/
}
